package com.hqq.create.prototype;

import java.io.*;

/**
 * Prototype
 * 原型模式
 * 该模式的思想就是将一个对象作为原型，对其进行复制、克隆，产生一个和原对象类似的新对象
 * Created by heqianqian on 2017/3/10.
 */
public class Prototype implements Cloneable,Serializable {

    private String string;

    private SerializableObject obj;

    /*浅复制*/
    /*将一个对象复制后，基本数据类型的变量都会重新创建，而引用类型，指向的还是原对象所指向的。*/
    public Object clone() throws CloneNotSupportedException {
        Prototype prototype = (Prototype) super.clone();
        return prototype;
    }

    /*深复制*/
    /*将一个对象复制后，不论是基本数据类型还有引用类型，都是重新创建的*/
    public Object deepClone() throws IOException, ClassNotFoundException {
        /*写入当前对象的二进制流*/
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        /*独处二进制流产生的新对象*/
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }


    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public SerializableObject getObj() {
        return obj;
    }

    public void setObj(SerializableObject obj) {
        this.obj = obj;
    }
}

class SerializableObject implements Serializable{
}